<?php

/**
 * @class Menu menu.lib.php
 *   
 * @brief Classe de gestion des menu
 *
 * @author  Jeremie Fouche
 *
 * La classe Menu permet de creer et naviguer dans un menu. Elle genere le code
 *   HTML correspondant au menu, et la page dans laquelle on se trouve.  
 */
class Menu
{
  var $items   = array();   /**< tableau des elements du menu */ 
  var $current = '';        /**< page courante */
  var $root    = '.';       /**< racine des pages du menu */

  /**
   * @brief  Constucteur
   *       
   * @param $current  page courante 
   * @param $root     racine des pages du menu 
   */     
  function Menu($current='', $root='.')
  {
    $this->current = $current;
    $this->root    = $root;
  }

  /**
   * @brief Affiche le code HTML du menu
   */     
  function show()
  {
    print $this->get();
  }

  /**
   * @brief recupere le code HTML du menu
   * 
   * @return une chaine de caractere correspondant au code HTML du menu      
   */     
  function get()
  {
    $str  = $this->start_menu();
    $str .= $this->recursive_get($this->items);
    $str .= $this->end_menu();

    return $str;
  }

  /**
   * @brief recupere le code HTML du menu
   * 
   * @return une chaine de caractere des items du menu d'un meme niveau.
   *   Cette fonction est appelle recursivement en fonction des niveaux.         
   */     
  function recursive_get($items)
  {
    global $auth, $perm;

    $str = '';
    foreach($items as $url => $datas)
    {
      if ( !isset($datas['perms'])
        || (isset($auth) && isset($perm) && $perm->have_perm($datas['perms'])) )
      {
        $bCurrent = ($datas['title'] == $this->current);
        $str .= sprintf( '<li%s><a href="%s%s"%s>%s</a></li>'."\n"
                       , $bCurrent ? ' class="active"' : ''
                       , $this->root
                       , $url
                       , $bCurrent ? ' class="current"' : ''
                       , $datas['title'] );
      }
    }
    return $str;
  }

  // Menu::shift_in
  //function shift_in($oldlevel, $level) { ; }

  // Menu::shift_out
  //function shift_out($oldlevel, $level) { ; }

  /**
   * @brief Permet de commencer le menu
   * 
   * Cette fonction est virtuelle, et peut etre surchargee dans la classe
   *   derivee.          
   * 
   * @return la chaine HTML correspondant au debut du menu      
   */     
  function start_menu()
  {
    return '<ul>';
  }

  /**
   * @brief Permet de terminer le menu
   * 
   * @return la chaine HTML correspondant a la fin du menu      
   */     
  function end_menu()
  {
    return '</ul>';
  }

}
?>
